const { CozeAPI, COZE_CN_BASE_URL, ChatStatus, RoleType } = require('@coze/api');
const { v4: uuidv4 } = require('uuid');
const axios = require('axios');

/**
 * 校验OSS文件是否存在
 * @param {string} url - 待校验的PPT链接
 * @returns {Promise<boolean>} 文件是否存在
 */
async function checkOSSFileExists(url) {
  try {
    const response = await axios.head(url, {
      timeout: 5000, // 超时5秒，避免阻塞
    });
    return response.status === 200;
  } catch (error) {
    console.error('[OSS校验失败]', url, error.message);
    return false;
  }
}

class CozeService {
  constructor() {
    this.apiKey = 'pat_IRykCAWGKgPv7rJsD5Yb6UNZCfgC2XJxzNaUl0rmDZ4xBQuBGG08db11PlQd6TH1';
    this.botId = '7535823171489546259';
    
    // 初始化Coze API客户端
    this.client = new CozeAPI({
      token: this.apiKey,
      baseURL: COZE_CN_BASE_URL, // 使用中国区域的API地址
    });
  }

  // 生成PPT主题
  async generatePPTTheme(params) {
    try {
      const userId = uuidv4();
      
      // 构建提示词
      const prompt = `请为"${params.subject}"学科的"${params.topic}"主题生成教学PPT大纲。

参数信息：
- 学科：${params.subject}
- 年级：${params.grade}
- PPT页数：${params.slideCount}
- 教学重点：${params.keyPoints || '无特殊要求'}

请生成详细的PPT大纲，包括：
1. PPT标题页
2. 目录页
3. 各章节内容页的标题和要点
4. 总结页
5. 每页的设计建议

请确保内容符合${params.grade}学生的认知水平。`;

      console.log('发送请求到Coze API...');
      console.log('Bot ID:', this.botId);
      console.log('User ID:', userId);
      
      // 使用createAndPoll方法自动处理异步响应
      const result = await this.client.chat.createAndPoll({
        bot_id: this.botId,
        user_id: userId,
        additional_messages: [{
          role: RoleType.User,
          content: prompt,
          content_type: 'text',
        }],
        auto_save_history: true,
        stream: false,
      });
      
      console.log('Coze API响应状态:', result.chat.status);
      console.log('Coze API完整响应:', JSON.stringify(result, null, 2));
      
      // 检查聊天状态
      if (result.chat.status === ChatStatus.COMPLETED) {
        // 优化：仅提取answer类型的消息内容，过滤中间过程消息
        let content = '';
        
        if (result.messages && result.messages.length > 0) {
          // 严格过滤：仅保留type为'answer'的消息
          const answerMessages = result.messages.filter(msg => 
            msg.type === 'answer'
          );
          
          console.log(`过滤后的answer消息数量: ${answerMessages.length}`);
          
          if (answerMessages.length > 0) {
            // 取最后一条answer消息作为最终回答
            content = answerMessages[answerMessages.length - 1].content;
          } else {
            // 如果没有找到answer类型消息，返回标准化错误
            console.error('未找到answer类型消息');
            throw new Error('PPT生成结果解析失败');
          }
        } else {
          throw new Error('PPT生成结果解析失败');
        }
        
        if (content && content.trim()) {
          console.log('成功提取answer内容，长度:', content.length);
          
          // 优化：纯净链接提取，严格匹配OSS的PPT链接格式
           const ossPptRegex = /https:\/\/pptself-hz\.oss-cn-hangzhou\.aliyuncs\.com\/open\/pptx\/\d{8}\/\d+\.pptx/g;
           const urlMatches = content.match(ossPptRegex);
           
           let uniqueUrls = [];
           if (urlMatches && urlMatches.length > 0) {
             // 去重处理：使用Set去除重复链接
             uniqueUrls = [...new Set(urlMatches)];
             console.log('[Coze响应解析] 原始内容:', content.substring(0, 200) + '...');
             console.log('[Coze响应解析] 提取链接:', uniqueUrls);
           }
          
          if (uniqueUrls.length > 0) {
            // 返回包含唯一下载链接的内容
            return {
              success: true,
              content: content,
              usage: result.chat.usage || {},
              chatId: result.chat.id,
              downloadUrl: uniqueUrls[0] // 使用第一个唯一链接
            };
          } else {
            // 如果不包含下载链接，返回原始内容
            return {
              success: true,
              content: content,
              usage: result.chat.usage || {},
              chatId: result.chat.id
            };
          }
        } else {
          console.error('响应中没有找到有效内容');
          throw new Error('响应内容为空');
        }
      } else if (result.chat.status === ChatStatus.FAILED) {
        console.error('聊天失败:', result.chat.last_error);
        throw new Error(`聊天失败: ${result.chat.last_error?.msg || '未知错误'}`);
      } else {
        console.error('聊天状态异常:', result.chat.status);
        throw new Error(`聊天状态异常: ${result.chat.status}`);
      }
      
    } catch (error) {
      console.error('Coze API调用失败:', error);
      
      // 处理不同类型的错误
      if (error.response) {
        // HTTP错误响应
        console.error('HTTP错误响应:', error.response.data);
        throw new Error(`PPT生成失败: ${error.response.data?.msg || error.response.statusText}`);
      } else if (error.message) {
        // 其他错误
        throw new Error(`PPT生成失败: ${error.message}`);
      } else {
        throw new Error('PPT生成失败: 未知错误');
      }
    }
  }

  // 生成教学设计
  async generateTeachingDesign(params) {
    try {
      const userId = uuidv4();
      
      const prompt = `请为"${params.subject}"科目的"${params.topic}"主题生成教学设计，学段：${params.grade}，课时：${params.duration}分钟`;

      console.log('发送教学设计请求到Coze API...');
      
      // 使用createAndPoll方法自动处理异步响应
      const result = await this.client.chat.createAndPoll({
        bot_id: this.botId,
        user_id: userId,
        additional_messages: [{
          role: RoleType.User,
          content: prompt,
          content_type: 'text',
        }],
        auto_save_history: true,
        stream: false,
      });
      
      console.log('教学设计API响应状态:', result.chat.status);
      
      // 检查聊天状态
      if (result.chat.status === ChatStatus.COMPLETED) {
        // 提取消息内容
        let content = '';
        
        if (result.messages && result.messages.length > 0) {
          // 查找助手的回复消息
          const assistantMessages = result.messages.filter(msg => 
            msg.role === RoleType.Assistant && msg.type === 'answer'
          );
          
          if (assistantMessages.length > 0) {
            content = assistantMessages[assistantMessages.length - 1].content;
          } else {
            // 如果没有找到助手消息，使用最后一条消息
            content = result.messages[result.messages.length - 1].content;
          }
        }
        
        if (content && content.trim()) {
          return {
            success: true,
            content: content,
            usage: result.chat.usage || {},
            chatId: result.chat.id
          };
        } else {
          throw new Error('响应内容为空');
        }
      } else if (result.chat.status === ChatStatus.FAILED) {
        throw new Error(`教学设计生成失败: ${result.chat.last_error?.msg || '未知错误'}`);
      } else {
        throw new Error(`教学设计状态异常: ${result.chat.status}`);
      }
      
    } catch (error) {
      console.error('教学设计API调用失败:', error);
      
      if (error.response) {
        throw new Error(`教学设计生成失败: ${error.response.data?.msg || error.response.statusText}`);
      } else if (error.message) {
        throw new Error(`教学设计生成失败: ${error.message}`);
      } else {
        throw new Error('教学设计生成失败: 未知错误');
      }
    }
  }
}

const cozeServiceInstance = new CozeService();

module.exports = cozeServiceInstance;
module.exports.checkOSSFileExists = checkOSSFileExists;